﻿using System;
using System.Collections.Generic;
using System.Linq;
using GroceryList.Domain.Model.Product;
using GroceryList.Model;
using Iesi.Collections.Generic;

namespace GroceryList.Domain.Model.GroceryList
{
    public class ListaCompra
    {
        protected ListaCompra(){}
        public virtual string Nombre { get; set; }
        public virtual DateTime Fecha { get; set; }
        private readonly Iesi.Collections.Generic.ISet<DetalleProducto> _detalleProducto;
        public virtual IEnumerable<DetalleProducto> DetalleProducto { get { return _detalleProducto; } }

        public virtual IEnumerable<DetalleProducto> DetallesModoCompra
        {
            get
            {
                return 
                    _detalleProducto.
                    Where(dp => dp.Cantidad > 0 && dp.Estado.Equals(EstadoDelDetalle.Desde(EstadoDetalle.Pendiente)));
            }
        }

        public virtual Guid Codigo { get; set; }

        public ListaCompra (string nombre, DateTime fecha)
        {
            Nombre = nombre; 
            Fecha = fecha;
            Codigo = Guid.NewGuid();
            _detalleProducto = new HashedSet<DetalleProducto>() ;
        }

        public override bool Equals(object obj)
        {
            return Equals(obj as ListaCompra);
        }

        public virtual bool Equals(ListaCompra other)
        {
            if (ReferenceEquals(null, other)) return false;
            if (ReferenceEquals(this, other)) return true;
            return other.Codigo.Equals(Codigo);
        }

        public override int GetHashCode()
        {
            return Codigo.GetHashCode();
        }

        public virtual void BorrarDetalles()
        {
            _detalleProducto.Clear();
        }

        public virtual void BorrarDetalle(DetalleProducto detalle)
        {
            _detalleProducto.Remove(detalle);
        }

        public virtual void AnhadirDetalle(Producto detalleProducto,int cantidad,string observaciones)
        {
            _detalleProducto.Add(new DetalleProducto(this, detalleProducto, cantidad, observaciones));
        }
    }
}